package store;

/**
 * @author jiang
 * @date 2021/10/30
 */
public abstract class AbstractStoreStrategy implements StoreStrategy {

    /**
     * 最大价值
     */
    protected static final int MAX_VALUE = 50;
    /**
     * 最小价值
     */
    protected static final int MIN_VALUE = 0;

    /**
     * 双倍减价天数
     */
    protected static final int MIN_SELL_IN = 0;

    /**
     * 日常减少价格
     */
    protected static final int COMMON_REDUCE_VALUE = 1;

    /**
     * 日常减少天数
     */
    protected static final int COMMON_REDUCE_SELL_IN = 1;

    /**
     * 每过一天，所有商品的SellIn值和Value值都减1。
     * 一旦过了销售剩余天数，价值就以双倍的速度下滑。
     * 商品的价值永远不会小于0，也永远不会超过50。
     *
     * @param item
     */
    @Override
    public void updateValue(Item item) {
        if (item.sellIn < MIN_SELL_IN) {
            reduceValue(item, COMMON_REDUCE_VALUE * 2);
        } else {
            reduceValue(item, COMMON_REDUCE_VALUE);
        }
    }

    /**
     * 减少价格
     *
     * @param item
     * @param tempValue
     */
    protected void reduceValue(Item item, int tempValue) {
        item.value = item.value - tempValue;
        if (item.value <= MIN_VALUE) {
            item.value = MIN_VALUE;
        }
        if (item.value >= MAX_VALUE) {
            item.value = MAX_VALUE;
        }
    }

    /**
     * 增加价格
     *
     * @param item
     * @param tempValue
     */
    protected void addValue(Item item, int tempValue) {
        item.value = item.value + tempValue;
        if (item.value <= MIN_VALUE) {
            item.value = MIN_VALUE;
        }
        if (item.value >= MAX_VALUE) {
            item.value = MAX_VALUE;
        }
    }

    /**
     * 更新销售天数
     *
     * @param item
     */
    @Override
    public void updateSellIn(Item item) {
        item.sellIn = item.sellIn - COMMON_REDUCE_SELL_IN;
    }

}
